package code.whmmm.util.simple;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/**
 * <p><b>
 * 日期格式化工具类， jdk 1.8 +
 * </b></p>
 * <br/>
 * 创建时间: 2019/12/3 8:51
 *
 * @author Zero
 * @since 1.8
 */
public enum TimeFormatter {


    /**
     * 格式化示例 2019-10-01,
     */
    STD_DATE("yyyy-MM-dd"),
    /**
     * yyyy-MM-dd HH:mm:ss
     */
    STD_DATETIME("yyyy-MM-dd HH:mm:ss"),

    /**
     * yyyy-MM-dd HH:mm
     */
    STD_DATE_MINUTE("yyyy-MM-dd HH:mm:ss"),

    /**
     * yyyy-MM-dd HH
     */
    STD_DATE_HOUR("yyyy-MM-dd HH"),

    /**
     * yyyy-MM
     */
    STD_MONTH("yyyy-MM"),
    /**
     * yyyy
     */
    STD_YEAR("yyyy"),
    /**
     * yyyyMMdd HH:mm:ss
     */
    COMPACT_DATETIME("yyyyMMdd HH:mm:ss"),

    /**
     * yyyyMMddHHmm
     */
    COMPAT_MINUTE("yyyyMMddHHmm"),
    /**
     * yyyyMMddHH
     */
    COMPACT_HOUR("yyyyMMddHH"),
    /**
     * yyyyMMdd
     */
    COMPACT_DAY("yyyyMMdd"),
    /**
     * yyyyMM
     */
    COMPACT_MONTH("yyyyMM"),
    /**
     * yyyy
     */
    YEAR("yyyy"),
    /**
     * 标准时间:  yyyy年M月d日
     */
    WORD_DATE("yyyy年M月d日"),

    /**
     * 标准时间: yyyy年M月d日 HH点mm分
     */
    WORD_DATETIME("yyyy年M月d日 HH点mm分");

    private static final Logger log = LoggerFactory.getLogger(TimeFormatter.class);

    private final String pattern;
    private static final int INIT_MAP_SIZE = 64;

    private static final ThreadLocal<Map<String, SimpleDateFormat>> CACHED_MAP =
            new ThreadLocal<Map<String, SimpleDateFormat>>();

    TimeFormatter(String pattern) {
        this.pattern = pattern;
    }

    /**
     * 从 ThreadLocal 中获取 SimpleDateFormat 对象。<br/>
     * 如果 ThreadLocal 中不存在该对象，则创建并返回。
     *
     * @return
     */
    private SimpleDateFormat getAndSetFormat() {
        Map<String, SimpleDateFormat> map = CACHED_MAP.get();
        if (map == null) {
            map = new ConcurrentHashMap<String, SimpleDateFormat>(INIT_MAP_SIZE);
            CACHED_MAP.set(map);
        }

        SimpleDateFormat format = map.get(pattern);
        if (format == null) {
            format = new SimpleDateFormat(pattern);
            map.put(pattern, format);
        }
        return format;
    }

    /**
     * 获取 format 对象
     *
     * @return
     */
    public SimpleDateFormat getDateFormat() {
        return getAndSetFormat();
    }


    public Date parse(String d) {
        if (StrUtil.isBlank(d)) {
            return null;
        }
        try {
            return getAndSetFormat().parse(d);
        } catch (Exception e) {
            log.error("字符串解析成时间对象失败: " + d + "," + e.getMessage(), e);
            return null;
        }
    }

    public String format(Date d) {
        if (d == null) {
            return null;
        }
        return getAndSetFormat().format(d);
    }

    /**
     * 返回 日期格式化 模板
     *
     * @return
     */
    public String getPattern() {
        return this.pattern;
    }
}
